using dotnet_ef_admin.Src.Models;
using dotnet_ef_admin.Src.Utilities;

namespace dotnet_ef_admin.Src.Services;

/// <summary>
///     这个接口定义了DeptService的契约。这个接口指定了DeptService必须实现的方法。
///     DeptService负责为Dept模型提供增删改查操作。
/// </summary>
public interface IDeptService {
    // 异步从数据库中获取所有部门。
    /// <returns>表示异步操作的Task，Task结果包含一个IEnumerable的Dept对象。</returns>
    Task<IEnumerable<DeptList>> GetDeptsAsync(FindAllRequest request);

    // 异步从数据库中根据ID获取部门。
    /// <param name="id">要获取的部门的ID。</param>
    /// <returns>表示异步操作的Task，Task结果包含找到的Dept对象（如果找到），否则为null。</returns>
    Task<Dept?> GetDeptByIdAsync(int id);

    // 异步在数据库中创建一个新部门。
    /// <param name="dept">表示要创建的部门的Dept对象。</param>
    /// <returns>表示异步操作的Task，Task结果包含创建的Dept对象。</returns>
    Task<Dept> CreateDeptAsync(Dept dept);

    // 异步在数据库中更新现有部门。
    /// <param name="dept">表示要更新的部门的Dept对象。</param>
    /// <returns>表示异步操作的Task，Task结果包含更新后的Dept对象。</returns>
    Task<Dept> UpdateDeptAsync(Dept dept);

    // 异步通过ID从数据库中删除部门。
    /// <param name="id">要删除的部门的ID。</param>
    /// <returns>表示异步操作的Task。</returns>
    Task DeleteDeptAsync(int id);

    // 异步从数据库中获取部门选项。
    Task<List<TransformedItem>> GetDeptOptionsAsync();
}

public class FindAllRequest {
    public string? Keywords { get; set; } = "";
    public int? Status { get; set; }
}

public class DeptList {
    public int Id { get; set; }
    public string? Name { get; set; }
    public int ParentId { get; set; }
    public string? CreateTime { get; set; }
    public string? UpdateTime { get; set; }
    public int? Sort { get; set; }
    public int Status { get; set; }
    public List<DeptList> Children { get; set; } = [];
}
